Persistent storage devices such as hard disk drives (HDD) and solid-state drives (SSD) are widely utilized in products ranging from data center servers to inexpensive embedded devices. Storage devices generally employ an input-output interface (referred to herein as the “host interface”) to communicate with a controlling device, e.g., central processing unit of a computing device. For a large number of storage devices, the host interfaces utilizes a block storage protocol. A block storage protocol provides a limited amount of information to the storage device, such as a logical block address (or range thereof) and storage operations (e.g., read, write, verify) be performed on the logical block address.
A user of the computing system generally interacts with the storage device via a filesystem. A filesystem may be provided by an operating system, e.g., through a driver and user interface. The filesystem, among other things, defines files (e.g., location, size, permissions, etc.), hierarchies (e.g., folder/directory structures), and interactions (e.g., open, close, edit, delete). The filesystem maps structures that define the files to block addresses that are used by the storage device. The block addresses may be sectors or a logical block addresses (LBAs) used by devices such as HDDs and SSDs.
The operating system and the storage device see stored data at different levels of abstraction. This provides flexibility, interoperability, and extensibility for the system as a whole. For example, the higher-levels of the operating system can access different filesystems via the same interface and different filesystem drivers. The storage device can be used with nearly any filesystem, as the block storage interface is not filesystem specific.